import json
import base64
import requests
import tempfile
import os
from typing import Optional
import time
import hashlib

class AliyunTTSService:
    """
    阿里云TTS服务封装，专门为古诗词朗读优化
    """
    
    def __init__(self, access_key_id: str, access_key_secret: str, app_key: str):
        """
        初始化阿里云TTS服务
        :param access_key_id: 阿里云AccessKey ID
        :param access_key_secret: 阿里云AccessKey Secret  
        :param app_key: 智能语音交互的AppKey
        """
        self.access_key_id = access_key_id
        self.access_key_secret = access_key_secret
        self.app_key = app_key
        self.base_url = "https://nls-gateway.cn-shanghai.aliyuncs.com/stream/v1/tts"
        
        # 古诗词朗读的推荐配置
        self.default_voice = "zhixiaoxia"  # 知性女声，适合诗词朗读
        self.default_format = "wav"
        self.default_sample_rate = 16000
        self.default_speech_rate = 0  # 稍慢的语速，便于学习
        self.default_pitch_rate = 0   # 标准音调

    def _add_ssml_for_poetry(self, text: str) -> str:
        """
        为古诗词文本添加SSML标记，增强朗读效果
        """
        # 检测诗句结构，在合适位置添加停顿
        # 常见的古诗格式：五言、七言
        lines = text.strip().split('\n')
        ssml_lines = []
        
        for line in lines:
            line = line.strip()
            if not line:
                continue
                
            # 为每行诗句添加适当的停顿和语调
            if len(line) == 10:  # 五言诗：2+2+1，2+2+1的节奏
                formatted_line = f"{line[:2]}<break time='200ms'/>{line[2:4]}<break time='200ms'/>{line[4]}<break time='500ms'/>{line[5:7]}<break time='200ms'/>{line[7:9]}<break time='200ms'/>{line[9]}"
            elif len(line) == 14:  # 七言诗：2+2+2+1，2+2+2+1的节奏  
                formatted_line = f"{line[:2]}<break time='200ms'/>{line[2:4]}<break time='200ms'/>{line[4:6]}<break time='200ms'/>{line[6]}<break time='500ms'/>{line[7:9]}<break time='200ms'/>{line[9:11]}<break time='200ms'/>{line[11:13]}<break time='200ms'/>{line[13]}"
            else:  # 其他格式，每两个字加短停顿
                formatted_line = ""
                for i in range(0, len(line), 2):
                    if i + 1 < len(line):
                        formatted_line += f"{line[i:i+2]}<break time='200ms'/>"
                    else:
                        formatted_line += line[i]
            
            ssml_lines.append(formatted_line)
        
        # 诗句之间添加较长停顿
        ssml_text = "<break time='800ms'/>".join(ssml_lines)
        
        # 包装在SSML标签中
        full_ssml = f'<speak>{ssml_text}<break time="1s"/></speak>'
        return full_ssml

    def generate_speech(self, 
                       text: str, 
                       voice: Optional[str] = None,
                       use_ssml: bool = True,
                       output_file: Optional[str] = None) -> str:
        """
        生成古诗词朗读音频
        :param text: 要朗读的古诗词文本
        :param voice: 音色选择，None则使用默认
        :param use_ssml: 是否使用SSML优化朗读效果
        :param output_file: 输出文件路径，None则生成临时文件
        :return: 音频文件路径
        """
        
        # 处理文本
        if use_ssml:
            processed_text = self._add_ssml_for_poetry(text)
            text_format = 1  # SSML格式
        else:
            processed_text = text
            text_format = 0  # 纯文本格式
        
        # 构建请求参数
        params = {
            'appkey': self.app_key,
            'token': self._get_token(),
            'text': processed_text,
            'format': self.default_format,
            'sample_rate': self.default_sample_rate,
            'voice': voice or self.default_voice,
            'speech_rate': self.default_speech_rate,
            'pitch_rate': self.default_pitch_rate,
            'enable_subtitle': False,
            'wait_complete': True,
            'text_type': text_format
        }
        
        try:
            # 发送请求
            response = requests.post(
                self.base_url,
                data=params,
                timeout=30,
                stream=True
            )
            
            if response.status_code != 200:
                raise Exception(f"TTS请求失败，状态码: {response.status_code}")
            
            # 检查响应内容类型
            content_type = response.headers.get('Content-Type', '')
            
            if 'audio' in content_type:
                # 成功获取音频数据
                if output_file is None:
                    # 生成临时文件
                    temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.wav')
                    output_file = temp_file.name
                    temp_file.close()
                
                # 保存音频数据
                with open(output_file, 'wb') as f:
                    for chunk in response.iter_content(chunk_size=8192):
                        f.write(chunk)
                
                return output_file
            else:
                # 可能是错误响应
                error_info = response.text
                raise Exception(f"TTS生成失败: {error_info}")
                
        except Exception as e:
            raise Exception(f"TTS生成音频时发生错误: {str(e)}")

    def _get_token(self) -> str:
        """
        获取阿里云TTS的访问token
        注意：这里简化了token获取逻辑，实际项目中应该实现完整的阿里云授权流程
        """
        # 实际项目中，这里应该调用阿里云的STS服务获取临时token
        # 为了演示目的，这里返回一个占位符
        # 您需要根据阿里云官方文档实现完整的token获取逻辑
        return "YOUR_ACCESS_TOKEN_HERE"

# 腾讯云TTS服务（备选方案）
class TencentTTSService:
    """
    腾讯云TTS服务封装，备选方案
    """
    
    def __init__(self, secret_id: str, secret_key: str, app_id: str):
        self.secret_id = secret_id
        self.secret_key = secret_key
        self.app_id = app_id
        self.base_url = "https://tts.tencentcloudapi.com/"
        
    def generate_speech(self, text: str, output_file: Optional[str] = None) -> str:
        """
        使用腾讯云TTS生成语音
        """
        # TODO: 实现腾讯云TTS接口调用
        # 具体实现请参考腾讯云TTS官方文档
        pass

# TTS服务工厂函数
def get_tts_service(provider: str = "aliyun", **kwargs):
    """
    TTS服务工厂函数
    :param provider: TTS服务提供商 ("aliyun" 或 "tencent")
    :param kwargs: 服务商特定的配置参数
    """
    if provider == "aliyun":
        return AliyunTTSService(**kwargs)
    elif provider == "tencent":
        return TencentTTSService(**kwargs)
    else:
        raise ValueError(f"不支持的TTS服务提供商: {provider}")

# 配置示例
"""
使用示例：

# 初始化TTS服务
tts_service = get_tts_service(
    provider="aliyun",
    access_key_id="YOUR_ACCESS_KEY_ID",
    access_key_secret="YOUR_ACCESS_KEY_SECRET", 
    app_key="YOUR_APP_KEY"
)

# 生成古诗朗读音频
audio_path = tts_service.generate_speech(
    text="床前明月光，疑是地上霜。举头望明月，低头思故乡。",
    use_ssml=True
)

print(f"朗读音频已生成: {audio_path}")
""" 